package com.example.demo.sf;

import java.util.Collection;
import java.util.Iterator;
import java.util.Queue;

public class QueueForArray<E> implements Queue<E>,Iterable<E> {

    private E[] array;
    //定义头指针
    private int head =0;
    // 定义尾指针
    private int tail =0;

    public QueueForArray(){}
    @SuppressWarnings("all")
    public QueueForArray(int capacity){
        //这里要空出一个位置，所以得+1
        array = (E[])new Object[capacity +1];
    }

    /**
     *  头指针的位置=== 尾指针的位置 的时候   是空的
     */
    @Override
    public boolean isEmpty() {
        return head==tail;
    }

    /**
     *   尾指针的位置+1  === 头指针的位置  是满的
     */
    public boolean isFull(){
        return (tail +1)%array.length == head;
    }

    @Override
    public Iterator<E> iterator() {
        return null;
    }

    @Override
    public int size() {
        return array.length;
    }



    @Override
    public boolean contains(Object o) {
        return false;
    }



    @Override
    public Object[] toArray() {
        return new Object[0];
    }

    @Override
    public <T> T[] toArray(T[] a) {
        return null;
    }

    @Override
    public boolean add(E e) {
        return false;
    }

    @Override
    public boolean remove(Object o) {
        return false;
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        return false;
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        return false;
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        return false;
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        return false;
    }

    @Override
    public void clear() {

    }

    /**
     * 入队
     * 先判断是不是满了，如果满了就返回false
     * 入队成功之后，移动尾指针的位置
     * 返回 true
     * @param e the element to add
     * @return
     */
    @Override
    public boolean offer(E e) {
        if(isFull()){
            return  false;
        }
        //在尾指针的位置插入元素
        array[tail] = e;
        //移动尾指针的位置
        tail = (tail+1)%array.length;
        return true;
    }

    /**
     * 移除队列头位置的元素
     * 先判断是不是空
     * @return
     */
    @Override
    public E poll() {
        if(isEmpty()){
            return null;
        }
        E value = array[head];
        // 这里头指针也需要向前移动
        head = (head+1)%array.length;
        return value;
    }

    /**
     * 获取头部元素
     * @return
     */
    @Override
    public E peek() {
        if(isEmpty()){
            return null;
        }
        return array[head];
    }

    @Override
    public E remove() {
        return null;
    }



    @Override
    public E element() {
        return null;
    }


}
